import com.young.factory.IFactory;
import com.young.factory.impl.CircleFactory;
import com.young.factory.impl.TriangleFactory;
import com.young.shape.IShape;
import com.young.shape.impl.Circle;
import com.young.shape.impl.Triangle;


public class Main {

    public static void main(String[] args) throws Exception {
        /**
         * 这里是工厂方法模式的经典做法,需要扩展业务时，
         * 例如现在需要新增画矩形的业务，则只需要在shape.impl包中新增rectangle类并实现IShape接口
         */
        new CircleFactory().getInstance().draw(); //画圆
        new TriangleFactory().getInstance().draw(); //画三角形

        /**
         * 下面则是利用Java反射，将上面的硬编码耦合转移到配置文件，使得系统扩展更灵活
         * 业务扩展方法并没有改变，获取产品实例的方式变成了动态加载
         */
        String className = "com.young.shape.impl.Circle"; //假装从配置文件中读取出来的数据
        Class<?> clazz = Class.forName(className);
        ((IShape) clazz.newInstance()).draw(); // 会根据配置文件创建具体对象
    }
}
